
/**
*这个作为smartList里的一个条,竖的条条
 * 能被拖动，能被点击，能设置自己的目标位置
 * 
 * 这个要做成失效的时候是不能点的
*/
package kgame5.kgui.kcomp {
import kgame5.kmath.MathDG;
import kgame5.kutil.*;

import flash.display.*;
import flash.events.*;
import flash.geom.*;

public class SmartSliderBarPoorH extends SmartSliderBar{
	//___________________PROPERTY___________________
	
	//--滚动条的事件
	private var sliderAimX:Number=0;
	private var bSliderDrag:Boolean=false;
	//___________________METHOD______________________
	public function SmartSliderBarPoorH(p_mc:MovieClip,EW:Number,initPercent:Number=0){
		//trace("SmartSliderBarPoorH",p_mc,EW);
		super(p_mc);
		init(EW);
		
		//-设置最开始的位置
		setPercent(initPercent);
		mc_slider.x=sliderAimX;
		mc_slider.y=0;
	}
	
	private function init(EW:Number){
		//--
		mc_bar.width=EW;
		
		//--
		if(mc_sb.stage==null){//如果是动态生成的，就是还没被加载到舞台
			mc_sb.addEventListener(Event.ADDED_TO_STAGE,addToStageHandler,false,0,true);
		}else{//如果本来就在舞台的，则要注册各种事件
			addToStageHandler(null);
		}
	}
	
	//直接设置目标,!!注意这个的原则是杂拖拽过程中，其实是要以拖拽为主的，用户输入优先
	//!!注意设置的是0~1
	override public function setPercent(p:Number){
		sliderAimX=mc_bar.width*p;
	}
	//返回百分比,0~1
	//这个最终是要返回mapH*p=ey;
	//sliderY/barH=mapH*p/(mapH-EH)
	override public function getPercent():Number{
		return mc_slider.x/mc_bar.width;
	}
	
	//=============这个是设置的sliderAimX，有用户输入的情况就是用户的优先
	//--移动到最大
	override public function moveMax(){
		sliderAimX=mc_bar.width;
	}
	//--移动到最小
	override public function moveMin(){
		sliderAimX=0;
	}
	//=====================
	private function addToStageHandler(e:Event){
		//--
		mc_sb.addEventListener(Event.ENTER_FRAME,enterFrameHandler,false,0,true);
		
		//mc_slider.addEventListener(MouseEvent.MOUSE_DOWN,mouseDownHandler_slider,false,0,true);
		Util.OnPress(mc_slider, mouseDownHandler_slider);
		
		//注意在没加入到stage之前这个的stage是空的!!
		mc_slider.stage.addEventListener(MouseEvent.MOUSE_UP,mouseUpHandler_slider,false,0,true);
		//mc_slider.addEventListener(MouseEvent.MOUSE_OUT,mouseUpHandler_slider);
		
		mc_bar.addEventListener(MouseEvent.MOUSE_DOWN,mouseDownHandler_bar,false,0,true);
		//Util.OnPress(mc_bar, mouseDownHandler_bar);
	}
	
	private var preP:Number=-1;
	private function enterFrameHandler(e:Event){
		//如果是失效的样子，则不要有拖拽
		if(this.isActive2==false){
			mc_slider.stopDrag();
			bSliderDrag=false;
			sliderAimX=mc_slider.x;
		}
		
		if(bSliderDrag==false){//没有拖动的时候使用缓动
			sliderAimX=MathDG.C(sliderAimX,0,mc_bar.width);
			mc_slider.x = MathDG.Spring (mc_slider.x, sliderAimX, 3);
		}
		
		//
		var p:Number=this.getPercent();
		if(preP!=p){
			preP=p;
			var ke:KEvent=new KEvent(SmartSliderBar.EVENTTYPE_SLIDERMOVE,null);
			this.dispatchEvent(ke);
		}
	}
	
	//-------------滚地图的模块
	private function mouseDownHandler_slider(e:MouseEvent){
		//trace("鼠标按下，启动拖拽");
		mc_slider.startDrag(false,new Rectangle(0,0,mc_bar.width,0));
		bSliderDrag=true;
		
		//--
		mc_slider.addEventListener(MouseEvent.MOUSE_MOVE,mouseMoveHandler_slider,false,0,true);
	}
	
	//这个是要检测全局的鼠标抬起，否则如果是在smartList之外鼠标抬起，则不会得到抬起事件
	private function mouseUpHandler_slider(e:MouseEvent){
		if(bSliderDrag==false){//不在拖拽中的就不处理了
			return;
		}
		//trace("鼠标抬起，关闭拖拽");
		mc_slider.stopDrag();
		bSliderDrag=false;
		
		//--这个是为了在鼠标抬起的时候mc_slider能在正确的位置 
		sliderAimX=this.mc_slider.x;
		this.mc_slider.x=sliderAimX;
		//--
		mc_slider.removeEventListener(MouseEvent.MOUSE_MOVE,mouseMoveHandler_slider);
		
	}
	private function mouseMoveHandler_slider(e:MouseEvent){
		sliderAimX=this.mc_slider.x;
		e.updateAfterEvent();
	}
	
	private function mouseDownHandler_bar(e:MouseEvent){
		//trace("鼠标点击");
		sliderAimX=e.localX*mc_bar.scaleX;
	}
}//end of class
}